//package mathutils;
//
//public class MathAnalyzer {
//	
//	public static double inf = 1./0;
//	
//	public static void main(String[] args) {
//		PointD p1 = new PointD(0, 0);
//		PointD p2 = new PointD(2, 1);
//		Line line1 = new Line(p1, p2);
//		Line line2 = new Line(new PointD(0, 1), new PointD(4, 1));
//		System.out.println(line1);
//		System.out.println(line2);
//		try {
//			double m = calcMeasureOfProximity(line2, line1);
//			System.out.println(m);
//		} catch (IllegalArgumentException e) {
//			System.out.println(e);
//		}
//		System.out.println(line1.oneDirection(line2));
//		
//
//		
//	}
//	
//	public static double calcMeasureOfProximity(Line line1, Line line2) throws IllegalArgumentException {
//		if (!line1.oneDirection(line2)) {
//			return inf;
//		}
//
//		double h = line1.getLength();
//		PointD p1 = line1.p1;
//		PointD p2 = line1.p2;
//		PointD p3 = getProjection(line2.p1, line1);
//		PointD p4 = getProjection(line2.p2, line1);
//		boolean intersec = false;
//		if (line1.contains(p3)){
//			p1 = p3;
//			intersec = true;
//		}
//		if (line1.contains(p4)){
//			p2 = p4;
//			intersec = true;
//		}
//		if (!intersec){
//			if (!line2.contains(p1)){
//				return inf;
//			}
//		}
//		double l = getDistance(p1, p2);
//		double d1;
//		double d2;
//		try{
//			d1 = line1.getDistanceTo(line1.createPerpendicularTo(line2, line1.p1));
//			d2 = line1.getDistanceTo(line1.createPerpendicularTo(line2, line1.p2));
//		} catch (IllegalArgumentException e){
//			return inf;
//		}
//		double ad1 = Math.abs(d1);
//		double ad2 = Math.abs(d2);
//		if (d1*d2 >= 0){
//			return h * h * (ad1 + ad2) / l / 2;
//		} else {
//			return h * h * (ad1 * ad1 + ad2 * ad2) / (ad1 + ad2) / l / 2;
//		}
//	}
//	
//	public static PointD getProjection(PointD p, Line l) {
//	    double fDenominator = l.a * l.a + l.b * l.b;
//	    if (fDenominator == 0) // p1 and p2 are the same
//	        return l.p1;
//
//	    double t = (p.x * (l.b) - l.b * l.p1.x - p.y * (l.a) + l.a * l.p1.y) / fDenominator;
//
//	    return new PointD(l.p1.x + (l.p2.x - l.p1.x) * t, l.p1.y + (l.p2.y - l.p1.y)*t);
//	}
//	
//	public static double getDistance(PointD p1, PointD p2) {
//		return Math.hypot(p1.x - p2.x, p1.y - p2.y);
//	}
//
// }
